// 封装 axios
import axios from 'axios'
// 导入 store
import store from '@/store'
// 导入 router
import router from '@/router'
// 导入 Toast
import { Toast } from 'vant'

const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net/'
})

// 专门用来刷新token的副本
const instance2 = axios.create({
  baseURL: 'http://toutiao.itheima.net/'
})

// 给副本添加请求拦截器,统一携带token
instance.interceptors.request.use(
  config => {
    // 获取 token
    const token = store.state.token.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 给副本添加响应拦截器
instance.interceptors.response.use(
  response => {
    return response
  },
  async error => {
    // console.dir(error)
    if (error.request.status === 401) {
      try {
        // 根据 refresh_token 得到新的 token
        const resfreshToken = store.state.token.refresh_token
        const res = await instance2({
          url: '/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: `Bearer ${resfreshToken}`
          }
        })
        const token = res.data.data.token
        // 将得到的新 token 保存到 vuex 中
        store.commit('changeToken', {
          token: token,
          refresh_token: resfreshToken
        })
        // 无感刷新
        const resAgain = await instance(error.config)
        return resAgain
      } catch {
        // 清除 token 中的信息
        store.commit('delToken')
        // 提示登录已过期
        Toast.fail('登录已过期')
        // 跳转会登陆页面
        router.push('/login')
      }
    }
    return Promise.reject(error)
  }
)

export default instance
